#include<bits/stdc++.h>
using namespace std;
#define ERROR 0
#define OK 1
typedef int Status;
typedef struct DNode{
	int data;
	DNode *next;
	DNode *prior;	
}DNode, *DLinkList;
Status Init(DLinkList &L)
{
	L = new DNode;
	if(!L) return ERROR;
	L->next = L;
	L->prior = L;
	return OK;
}
Status Create(DLinkList &L, int n)
{
	DNode *t = L;
	for(int i = 0; i < n; i ++)
	{
		DNode *p = new DNode;
		cin >> p->data;
		t->next = p;
		p->prior = t;
		p->next = L;
		L->prior = p;
		t = p;
	}
}
int Symmetry(DLinkList L) // 判断带头结点的循环双向链表是否对称
{
	/**************Begin*********************/
	// 处理空链表的情况
    if (L->next == L) return 1;
    
    DNode *p = L->next; // 从头结点后的第一个节点开始
    DNode *q = L->prior; // 指向链表的最后一个节点
    while (p != q && p->prior != q) 
	{ 
		// 当未相遇且未交叉时继续比较
        if (p->data != q->data) return 0;
        p = p->next;
        q = q->prior;
    }
    return 1;
	 
    /*************End***********************/
}
void Show(DLinkList L)
{
	DNode *p = L->next;
	while(p != L)
	{
		cout << p->data << ' ';
		p = p->next;
	}
	cout << endl;
}
int main()
{
	DLinkList L;
	Init(L);
	
	int n;
	cin >> n;
	Create(L, n);
 
	int flag = Symmetry(L);
	if(flag) cout << "Yes" << endl;
	else cout << "No" << endl;
	
	
	return 0; 
}